<?php
// +----------------------------------------------------------------------
// | 萤火商城系统 [ 致力于通过产品和服务，帮助商家高效化开拓市场 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed 这不是一个自由软件，不允许对程序代码以任何形式任何目的的再发行
// +----------------------------------------------------------------------
// | Author: 萤火科技 <admin@yiovo.com>
// +----------------------------------------------------------------------
declare (strict_types = 1);

namespace app\api\model\dealer;

use app\api\model\dealer\User as DealerUserModel;
use app\common\library\helper;
use app\common\model\dealer\Referee as RefereeModel;
use think\Paginator;

/**
 * 分销商推荐关系模型
 * Class Referee
 * @package app\api\model\dealer
 */
class Referee extends RefereeModel {
	/**
	 * 隐藏字段
	 * @var array
	 */
	protected $hidden = [
		'store_id',
		'create_time',
	];

	/**
	 * 获取我的团队列表
	 * @param int $dealerId 分销商ID
	 * @param array $param
	 * @return array|mixed|Paginator
	 * @throws \think\db\exception\DataNotFoundException
	 * @throws \think\db\exception\DbException
	 * @throws \think\db\exception\ModelNotFoundException
	 */
	public function getList(int $dealerId, array $param = []): Paginator {
		// 获取列表记录
		$list = parent::getList($dealerId, $param);
		// 获取被推荐人的下级成员数量
		return !$list->isEmpty() ? $this->getSubTeamNum($list) : $list;
	}

	/**
	 * 获取被推荐人的下级成员数量
	 * @param mixed $list 我的团队列表
	 * @return mixed
	 * @throws \think\db\exception\DataNotFoundException
	 * @throws \think\db\exception\DbException
	 * @throws \think\db\exception\ModelNotFoundException
	 */
	private function getSubTeamNum($list) {
		// 被推荐人ID集
		$userIds = helper::getArrayColumn($list, 'user_id');
		// 获取分销商列表
		$mdoel = new DealerUserModel;
		$dealerList = $mdoel->getListByUserIds($userIds);
		// 整理到我的团队列表
		$dealerList = helper::arrayColumn2Key($dealerList, 'user_id');
		foreach ($list as &$item) {
			$item['subDealer'] = $dealerList[$item['user_id']] ?? null;
		}
		return $list;
	}

	/**
	 * 创建推荐关系
	 * @param int $userId 用户ID
	 * @param int $refereeId 推荐人ID
	 * @return bool
	 * @throws \think\Exception
	 * @throws \think\db\exception\DataNotFoundException
	 * @throws \think\db\exception\DbException
	 * @throws \think\db\exception\ModelNotFoundException
	 */
	public static function createRelation(int $userId, int $refereeId): bool {

		// 自分享
		if ($userId == $refereeId) {
			return false;
		}
		// # 记录一级推荐关系
		// 判断当前用户是否已存在推荐关系
		if (self::isExistReferee($userId)) {
			return false;
		}
		// 判断推荐人是否为分销商
		if (!User::isDealerUser($refereeId)) {
			return false;
		}
		// 新增关系记录
		$model = new self;
		$model->add($refereeId, $userId, 1);

		// # 记录二级推荐关系
		// 二级分销商id
		$referee2Id = self::getRefereeUserId($refereeId, 1, true);
		// 新增关系记录
		$referee2Id > 0 && $model->add($referee2Id, $userId, 2);
		// # 记录三级推荐关系

		return true;
	}

	/**
	 * 新增关系记录
	 * @param int $dealerId 分销商ID
	 * @param int $userId 用户ID
	 * @param int $level 等级
	 * @return bool
	 */
	private function add(int $dealerId, int $userId, int $level = 1): bool {
		// 新增推荐关系
		$this->insert([
			'dealer_id' => $dealerId,
			'user_id' => $userId,
			'level' => $level,
			'store_id' => self::$storeId,
			'create_time' => time(),
		]);
		// 记录分销商成员数量
		User::setMemberInc($dealerId, $level);
		return true;
	}

	/**
	 * 是否已存在推荐关系
	 * @param int $userId
	 * @return bool
	 */
	private static function isExistReferee(int $userId): bool {
		return (bool) self::get(['user_id' => $userId]);
	}
}